import os
import logging
import time
from logging.handlers import TimedRotatingFileHandler
from typing import Optional

class ColoredFormatter(logging.Formatter):
    """带颜色的日志格式化器（仅控制台输出使用）"""
    # 终端颜色编码
    COLOR_CODES = {
        logging.DEBUG:      '\033[0;36m',           # 青色
        logging.INFO:       '\033[0;32m',           # 绿色
        logging.WARNING:    '\033[0;33m',           # 黄色
        logging.ERROR:      '\033[0;31m',           # 红色
        logging.CRITICAL:   '\033[1;31m',           # 加粗红色
    }
    RESET_CODE = '\033[0m'                          # 重置颜色
    
    def format(self, record: logging.LogRecord) -> str:
        # 为不同级别添加颜色
        color_code = self.COLOR_CODES.get(record.levelno, self.RESET_CODE)
        # 原始格式化内容
        formatted_msg = super().format(record)
        # 添加颜色并重置
        return f"{color_code}{formatted_msg}{self.RESET_CODE}"
    
def setup_logger(
    logger_name: str,
    log_file: str = "app.log",
    log_dir: str = "logs",
    level: int = logging.INFO,
    backup_count: int = 30,
    format_str: Optional[str] = None,
) -> logging.Logger:
    """
    @date 2025/09/25
    @author cmx-cxd
    配置并返回一个日志记录器
    
    Args:
        logger_name: 日志器名称（确保唯一）
        log_file: 日志文件名
        log_dir: 日志文件存放目录
        level: 日志级别（DEBUG/INFO/WARNING/ERROR/CRITICAL）
        backup_count: 保留的日志文件数量
        format_str: 自定义日志格式（None则使用默认格式）
    
    Returns:
        配置好的Logger实例
    """
    # 创建日志目录
    os.makedirs(log_dir, exist_ok=True)
    log_path = os.path.join(log_dir, log_file)

    # 创建日志器（避免重复添加处理器）
    logger = logging.getLogger(logger_name)
    if logger.hasHandlers():
        return logger  # 已配置过的日志器直接返回
    logger.setLevel(level)

    # 默认日志格式（包含详细信息）
    if not format_str:
        format_str = (
            "%(asctime)s - %(name)s - %(levelname)s - "
            "%(module)s.%(funcName)s:%(lineno)d - %(message)s"
        )
    
    # 时间格式
    datefmt = "%Y-%m-%d %H:%M:%S"

    # 1. 文件日志处理器（按天分割，保留30天）
    file_handler = TimedRotatingFileHandler(
        filename=log_path,
        when="midnight",  # 每天午夜分割
        interval=1,       # 间隔1天
        backupCount=backup_count,  # 保留30个备份
        encoding="utf-8"  # 支持中文
    )
    file_handler.setLevel(level)
    file_handler.setFormatter(logging.Formatter(format_str, datefmt=datefmt))

    # 2. 控制台日志处理器（带颜色）
    console_handler = logging.StreamHandler()
    console_handler.setLevel(level)
    console_handler.setFormatter(ColoredFormatter(format_str, datefmt=datefmt))

    # 添加处理器到日志器
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    # 记录日志初始化信息
    logger.info(f"日志系统初始化完成，日志文件路径: {log_path}")
    return logger


# 全局默认日志器（方便快速使用）
default_logger = setup_logger("esrgan_default")